Ugneždene petlje
U prethodne dve lekcije videli smo kako se koriste naredbe ponavljanja - petlje. Ove naredbe mogu da se kombinuju. Postavljanje jedne petlje unutar tela druge petlje zove se ugneždavanje. Kada se dve petlje ugnezde, spoljašnja petlja određuje broj ponavljanja unutrašnje petlje. Svi tipovi petlji se mogu ugneždavati, ali je ipak najčešće ugneždavanje for petlji.
Možemo da pogledamo jedan primer iz života. Odometar (uređaj koji meri pređeno rastojanje) u automobilu radi po sličnom principu kao i ugneždene petlje.
Ovaj brojač kilometraže u automobilu je veoma sličan sistemu od 6 ugneždenih for petlji, gde svaka petlja "broji"/"ide" od 0 do 9. Krajnji desni broj/cifra se menja/iterira najbrže, tako što se "pomera" od 0 do 9 kako vozimo automobil. Sledeća for petlja imitira ove promene krajnje desne cifre brojčanika.
for(cifra1 = 0; cifra1 <= 9; cifra1++) { Console.WriteLine(cifra1); }
Krajnja desna cifra nije jedina koja se menja. Sve ostale cifre brojčanika se takođe menjaju, ali sa manjom brzinom promene. Za svakih 10 promena cifre sa desna, njoj susedna cifra brojčanika, uveća se/inkrementira za jedan. Dve ugneždene petlje prikazane ispod mogu poslužiti kao ilustracija promene krajnje dve cifre brojčanika odometra.
for (cifra2 = 0; cifra2 <= 9; cifra2++) { for (cifra1 = 0; cifra1 <= 9; cifra1++) { Console.WriteLine(cifra2 + " " + cifra1); } }
Prva petlja koju vidimo, petlja sa brojačem cifra2 je spoljašnja petlja, a druga, petlja sa brojačem cifra1 je unutrašnja petlja. Broj cifara brojčanika odometra određuje broj ugneždenih petlji koje služe za ilustraciju.
Pri radu sa ugneždenim petljama, spoljašnja petlja se menja tek kada se unutrašnja petlja sasvim završi (ili se prekine).
Pogledaćemo šta se dešava u svakom koraku u primeru ugneždenih petlji koji sledi. Da bismo sebi olakašali posao praćenja, smanjili smo broj ponavljanja obe petlje.
for (cifra2 = 0; cifra2 <= 3; cifra2++) { for (cifra1 = 0; cifra1 <= 2; cifra1++) { Console.WriteLine(cifra2 + " " + cifra1); } }
U sledećoj tabeli može da se vidi stanje posle svakog koraka unutrašnje petlje.
|Stanje promenljivih u memoriji| | Ispis na ekranu| |:-----------------|:-------------:| | int cifra1 | int cifra2 | | | 0 | 0 | 0 0 | | | 1 | 0 1 | | | 2 | 0 2 | | | 3 kraj petlje | | | 1 | 0 | 1 0 | | | 1 | 1 1 | | | 2 | 1 2 | | | 3 kraj petlje | | | 2 | 0 | 2 0 | | | 1 | 2 1 | | | 2 | 2 2 | | | 3 kraj petlje | | | 3 | 0 | 3 0 | | | 1 | 3 1 | | | 2 | 3 2 | | | 3 kraj petlje | | | 4 kraj petlje | |
Imaj na umu da će u memoriji vrednosti brojačkih promenljivih for petlji u jednom trenutku uzeti vrednost za 1 veću od same granice brojačkog for ciklusa da bi sama petlja mogla da se prekine.
Jezik C# dozvoljava kombinovanje/ugneždavanje for, while i do while petlji.
Primer 1
Sledi programski kod koji upotrebom dve ugneždene for petlje, ispisuje zvezdice u trougaonoj formi na ekranu.
static void Main(string[] args) { int brojac1, brojac2; for (brojac2 = 1; brojac2 <= 5; brojac2++) { for (brojac1 = brojac2; brojac1 <= 5; brojac1++) { Console.Write("*"); // ispis zvezdice na ekran } Console.WriteLine(); // prelazak u novi red ekrana } }
Na ekranu će se ispisati sledeće:
***** **** *** ** *
Primer 2
Kao što je već rečeno, jedna vrsta petlje se može ugnezditi sa drugim tipom petlje. Možemo, na primer, koristiti while petlju unutar for petlje. U programskom kodu koji sledi, spoljašnja petlja će se izvršiti tri puta (za vrednosti promenljive brojac2: 0, 1, i 2). Kada se prvi put bude izvršila, unutrašnja će prikazati brojeve od 0 do 5. Za drugo izvršenje spoljašnje petlje, unutrašnja će prikazati brojeve od 1 do 5, a za treće, brojeve od 2 do 5. Tako će konačan prikaz ovog programa biti: 012345123452345.
static void Main(string[] args) { int brojac1, brojac2; for (brojac2 = 0; brojac2 <= 2; brojac2++) { brojac1 = brojac2; while (brojac1 <= 5) { Console.Write(brojac1); brojac1++; } } }
Primer 3
Tablicu množenja možemo prikazati sledećim programom.
static void Main(string[] args) { Console.WriteLine("Tablice"); int brojac1 = 1, brojac2 = 1; while (brojac2 <= 10) { brojac1 = 1; while (brojac1 <= 10) { Console.Write(brojac2 + " * " + brojac1 + " = "); Console.WriteLine(brojac1 * brojac2); brojac1++; } brojac2++; Console.WriteLine(); } }
Primer 4
Možemo da analiziramo program koji ispisuje brojeve u trougaonoj formi uz pomoć ugneždenih petlji.
static void Main(string[] args) { for (int brojac2 = 0; brojac2 <= 5; brojac2++) { for (int brojac1 = 0; brojac1 <= brojac2; brojac1++) { Console.Write(" " + brojac1 + " "); } Console.WriteLine(); } }
Vrednosti promenljivih i stanja na ekranu posle svakog koraka:
brojac2=0 brojac1=0 Trenutno stanje na ekranu: 0 brojac2=1 brojac1=0 do brojac1=1 Trenutno stanje na ekranu: 0 0 1 brojac2=2 brojac1=0 do brojac1=2 Trenutno stanje na ekranu: 0 0 1 0 1 2 brojac2=3 brojac1=0 do brojac1=3 Trenutno stanje na ekranu: 0 0 1 0 1 2 0 1 2 3 brojac2=4 brojac1=0 do brojac1=4 Trenutno stanje na ekranu: 0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 brojac2=5 brojac1=0 do brojac1=5 Konačni ispis na ekranu: 0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5